<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>11_Promise对象</title>
</head>
<body>
<!--
1. 理解:
  * Promise对象: 代表了未来某个将要发生的事件(通常是一个异步操作)
  * 有了promise对象, 可以将异步操作以同步的流程表达出来, 避免了层层嵌套的回调函数(俗称'回调地狱')
  * ES6的Promise是一个构造函数, 用来生成promise实例
2. 使用promise基本步骤(2步):
  * 创建promise对象
    let promise = new Promise((resolve, reject) => {
        //初始化promise状态为 pending
      //执行异步操作
      if(异步操作成功) {
        resolve(value);//修改promise的状态为fullfilled
      } else {
        reject(errMsg);//修改promise的状态为rejected
      }
    })
  * 调用promise的then()
    promise.then(function(
      result => console.log(result),
      errorMsg => alert(errorMsg)
    ))
3. promise对象的3个状态
  * pending: 初始化状态
  * fullfilled: 成功状态
  * rejected: 失败状态
4. 应用:
  * 使用promise实现超时处理

  * 使用promise封装处理ajax请求
    let request = new XMLHttpRequest();
    request.onreadystatechange = function () {
    }
    request.responseType = 'json';
    request.open("GET", url);
    request.send();
-->

<script type="text/javascript">
  // 创建promise对象 new这个对象是同步的
  let promise=new Promise((resolve,reject)=>{
      // 初始化promise状态 pending
      console.log(111)
      //执行异步操作，发送ajax  或者开启 定时器
      setTimeout(()=>{
          console.log(333)
          //根据异步任务的返回结果，修改promise状态
          // 如果异步任务执行成功
          //resolve('ok') //修改promise的状态为成功状态 fullfilled
          // 如果异步任务执行失败
          reject('err') //修改promise的状态为失败状态 rejected
      },2000)
  })
  console.log(222)
  promise.then(
      (data)=>{
          //成功的状态
          console.log(data)
      },
      (error)=>{
      //    失败的状态
          console.log(error)
      }
      )


  // demo1
  function  getdata(url) {
      let promise=new promise((resolve,reject)=>{
          $.ajax({
              url:url,
              methods:'GET',
              success:function (res) {
                  resolve(res);
              },
              error:function (res) {
                  reject(res);
              }
          })
      })
      return promise;
  }

  getdata('http://www.xxx.com').then(
      (data)=>{
          let url2='http://localhost:3000/'+data.curl;
          // 发请求 获得另一个接口数据,我们把结果promise 在return出去
          return getdata(url2);
      },
      (error)=>{}
  ).then(
      (data)=>{},
      (err)=>{},
  )
</script>

</body>

</html>